dbt Metricsで定義した指標に対してWINDOW関数を使うことができる「Secondary calculations」を試してみた
さがらです。
dbt Metricsで定義した指標に対してWINDOW関数を使うことができるSecondary calculationsを試してみたので、本記事でまとめてみます。
前提
リポジトリは、dbt-labs/jaffle_shop_metricsをforkした以下のリポジトリを用います。
また、以下に実行環境と各製品のバージョンを記しておきます。
- 実行環境:dbt CloudのIDE
- dbt-core:1.3
- dbt-labs/metrics:1.3.2
試してみた
ということで、早速Secondary calculationsを試してみます。
Secondary calculationsの使い方
Secondary calculationsは、実際にmetrics.calculate
マクロを用いてSELECT文を発行するときに使用します。
書き方は下記のような感じで、metrics.calculate
マクロの中でsecondary_calculations
を定義し、各種Secondary calculationsのマクロを使用すればOKです。※Secondary calculationsのマクロの種類と使い方は後述します。
select * from {{ metrics.calculate( metric('revenue'), grain='week', secondary_calculations = [ metrics.period_over_period( comparison_strategy = 'difference', interval = 1, alias = 'week_over_week' ) ] ) }}
また、secondary_calculations
の中に複数のSecondary calculationのマクロを定義することで、一度に複数のSecondary calculationsを計算することも可能です。
select * from {{ metrics.calculate( metric('revenue'), grain='week', secondary_calculations = [ metrics.period_over_period( comparison_strategy = 'difference', interval = 1, alias = 'week_over_week' ), metrics.rolling( aggregate = 'average', interval = 4, alias = 'rolling' ) ] ) }}
Period over Period
Period over Periodは、ある指標について別の期間の値と比較し、割合や差分を出すことが出来るSecondary calculationsです。
metrics.period_over_period
を使用します。このマクロの各種オプションについてはこちらに書いてあります。
以下、コードのサンプルと実際の出力結果です。comparison_strategy = 'difference'
、interval = 1,
とすることで、1つ前の週との差分の値を出しています。
select * from {{ metrics.calculate( metric('revenue'), grain='week', secondary_calculations = [ metrics.period_over_period( comparison_strategy = 'difference', interval = 1, alias = 'week_over_week' ) ] ) }}
Period to Date
Period to Dateは、元々のmetrics.calculate
のgrain
で指定した期間よりも粗い期間を指定することで、指定した粗い期間の間での最大値・平均値を出すことが出来るSecondary calculationsです。
metrics.period_to_date
を使用します。このマクロの各種オプションについてはこちらに書いてあります。
以下、コードのサンプルと実際の出力結果です。metrics.calculate
でgrain = 'day'
、metrics.period_to_date
でaggregate = 'average'&period = 'month'
とすることで、REVENUE
では日毎のrevenueを返していますが、REVENUE_MONTH_TO_DATE
では各月ごとにその日までのrevenueの平均値を返しています。
Rolling
Rollingは、ある指標について指定したinterval
の行数だけ集計を行った結果を返すことが出来るSecondary calculationsです。
metrics.calculate
を使用します。このマクロの各種オプションについてはこちらに書いてあります。
以下、コードのサンプルと実際の出力結果です。aggregate = 'average'
、interval = 4
とすることで、REVENUE_ROLLING
列では4行分(4週分)のrevenueの平均値を出しています。
select * from {{ metrics.calculate( metric('revenue'), grain = 'week', secondary_calculations = [ metrics.rolling( aggregate = 'average', interval = 4, alias = 'rolling' ) ] ) }}
Prior
Priorは、ある指標について指定したinterval
の行数だけ遡った値を出すことが出来るSecondary calculationsです。
metrics.prior
を使用します。このマクロの各種オプションについてはこちらに書いてあります。
以下、コードのサンプルと実際の出力結果です。interval = 1
することで、REVENUE_1_WEEKS_PRIOR
では1行前(1週前)のrevenueの値を出しています。
select * from {{ metrics.calculate( metric('revenue'), grain = 'week', secondary_calculations = [ metrics.prior( interval = 1, alias = '1_weeks_prior' ) ] ) }}
最後に
dbt Metricsで定義した指標に対してWINDOW関数を使うことができるSecondary calculationsを試してみました。
少し加筆するだけで、SQLで書くと複雑なWINDOW関数を使えるので非常に便利だなと感じました!